/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 刘国水
 * Date: 2025-04-27
 * Time: 20:18
 */
public class test {
    public class MySingList implements IList{

        static class ListNode{
            //数据
            public int val;

            //节点的引用
            public ListNode next;

            //构造方法实现val的赋值
            public ListNode(int val) {
                this.val = val;
            }
        }

        public ListNode head;


        public void addFirst(int data) {
            ListNode node = new ListNode(data);
            node.next = head;
            head = node;
        }


        public void addLast(int data) {
            ListNode node = new ListNode(data);
            if(head == null) {
                head = node;
                return;
            }

            ListNode cur = head;
            while (cur.next != null) {
                cur = cur.next;
            }
            cur.next = node;
        }


        public void addIndex(int index, int data) {
            checkPos(index);

            if(index == 0) {
                addFirst(data);
                return;
            }
            int ret = size();
            if(index == ret) {
                addLast(data);
                return;
            }

            ListNode cur = findIndex(index);
            ListNode node = new ListNode(data);
            node.next = cur.next;
            cur.next = node;

        }

        private ListNode findIndex(int index) {
            ListNode cur = head;
            int count = 0;
            while (count != index-1) {
                count++;
                cur = cur.next;
            }
            return cur;
        }

        private void checkPos(int pos) {
            if(pos < 0 || pos > size()){
                System.out.println("index位置不合法，无法传值！");
            }
        }


        public boolean contains(int key) {
            ListNode cur = head;
            while (cur != null) {
                if (cur.val == key) {
                    return true;
                }
                cur = cur.next;
            }
            return false;
        }


        public void remove(int key) {

            if(head == null) {
                System.out.println("链表为空，无法进行删除操作！");
                return;
            }

            if(head.val == key) {
                head = head.next;
                return;
            }

            ListNode cur = search(key);
            if(cur == null) {
                System.out.println("没有你要删除的数据" + key);
                return;
            }

            ListNode del = cur.next;
            cur.next = del.next;

        }

        private ListNode search(int key) {
            ListNode cur = head;
            while (cur.next != null) {
                if(cur.next.val == key) {
                    return cur;
                }
                cur = cur.next;
            }
            return null;
        }


        public void removeAllKey(int key) {
            if(head == null) {
                return;
            }

            ListNode prev = head;
            ListNode cur = head.next;
            while (cur != null) {
                if(cur.val == key) {
                    prev.next = cur.next;
                    cur = cur.next;
                }else {
                    prev = cur;
                    cur = cur.next;
                }
            }
            //最后判断一次头节点
            if(head.val == key) {
                head = head.next;
            }

        }


        public int size() {
            int count = 0;
            ListNode cur = head;
            while (cur != null) {
                count++;
                cur = cur.next;
            }
            return count;
        }


        public void clear() {
            ListNode cur = head;
            while (cur != null){
                ListNode curN = cur.next;
                cur.next = null;
                cur = curN;
            }
            head = null;
        }


        public void display() {
            ListNode cur = head;
            while (cur != null) {
                System.out.print(cur.val + " ");
                cur = cur.next;
            }
            System.out.println();
        }
    }

}
